#include "TcpServer.hpp"

// #include "Command.hpp"
#include "Protocol.hpp"
#include "Calculator.hpp"
#include "Daemon.hpp"
using cal_fun = std::function<Response(const Request &req)>;

class MyParse
{
public:
    MyParse(cal_fun cal)
        : _cal(cal)
    {
    }
    // 解决读取不完善的问题
    // 解析发送过来的报头
    // length\r\n
    // length\r\n{json}
    // length\r\n{json}\r
    // length\r\n{json}\r\n -> 解析这个
    // length\r\n{json}\r\nlength\r\n{json}\r\n
    std::string Entry(std::string &task_str)
    {
        std::string message;
        std::string return_str;
        // 1.解析报文
        while (Decode(task_str, &message))
        {
            if (message.empty()) break;
            // 2.解析发送过来的请求
            Request req;
            req.deserialization(message);
            // 3.进行计算，并且构建应答
            Response res = _cal(req);
            res.Print();
            // 4. 序列化
            std::string str;
            res.serialization(&str);
            // 5. 添加长度报头
            Encode(str);
            LOG(LogLevel::DEBUG) << str;
            return_str += str;
        }
        return return_str;
    }
    ~MyParse() {}

private:
    cal_fun _cal;
};

int main(int argc, char *argv[])
{

    ENABLE_FILESYSTEM_LOG_STRATEGY(); //让日志结果输出到文件当中，这样可以方便调试
    Daemon(false,false); //此时下面的进程就是守护进程

    Calculator cal;
    MyParse parse([&cal](const Request &req)->Response 
                  { return cal.Excute(req); });
    if (argc != 2)
    {
        std::cout << "Usage: user ./server_tcp port" << std::endl;
        return 1;
    }

    uint16_t port = std::stoi(argv[1]);
    std::shared_ptr<TcpServer> server = std::make_shared<TcpServer>(port);
    server->InitServer();
    server->RegisterHander([&parse](std::string &s)
                           { return parse.Entry(s); });
    server->Start();
    return 0;
}
